package cn.le.io;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;

/**
 * Selector : Java nio的选择器允许一个单独的线程来监视多个输入通道,多个通道可以共用一个选择器,然后使用
 * 一个独立的线程来"选择"通道,这些通道里已经有可以处理的输入或者选择已经准备写入的通道,这种选择机制.
 * 使得一个单独的线程很容易来管理多个通道
 *
 * register : 要使用Selector.得向Selector注册Channel,然后调用它的Select().这个方法会一直
 * 阻塞到某个注册的通道有时间就绪,一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,
 * 数据接收等.
 * 四种事件:
 * SelectionKey.OP_ACCEPT：服务端接收客户端连接事件
 * SelectionKey.OP_CONNECT：客户端连接服务端事件
 * SelectionKey.OP_READ：读事件
 * SelectionKey.OP_WRITE：写事件
 *
 * selectionKey有四个方法判断是否为某个事件
 * selectionKey.isAcceptable();
 * selectionKey.isConnectable();
 * selectionKey.isReadable();
 * selectionKey.isWritable();
 *
 *
 * register与Selector一起使用时,Channel必须处于非阻塞模式下,这意味着FileChannel不能和Selector一起使用,
 * 因为FileChannel不能切换到非阻塞模式.
 *
 */
public class SelectorDemo {


    public static void main(String[] args) throws Exception {

        ByteBuffer bf = ByteBuffer.wrap(new byte[]{1,2,3,4,5});
        IntBuffer ib = bf.asIntBuffer();
        bf.rewind();
        while (bf.hasRemaining())
        {
            System.out.println(bf.get());
        }

    }

}
